package com.shengwei.truck.driver.model;
import android.app.Application;

import androidx.lifecycle.MutableLiveData;

import com.shengwei.truck.driver.bean.JsonCar;
import com.shengwei.truck.driver.bean.JsonCurUserInfoData;
import com.shengwei.truck.driver.bean.JsonLoginData;
import com.shengwei.truck.driver.bean.JsonMsgListData;
import com.shengwei.truck.driver.bean.JsonPostFileData;
import com.shengwei.truck.driver.bean.JsonPoundsState;
import com.shengwei.truck.driver.bean.JsonStatisticsOneDayData;
import com.shengwei.truck.driver.bean.JsonStatisticsYmdData;
import com.shengwei.truck.driver.bean.JsonTrackData;
import com.shengwei.truck.driver.bean.PoundsListBean;
import com.shengwei.truck.driver.bean.Result;
import com.shengwei.truck.driver.bean.task.JsonOrderDetailData;
import com.shengwei.truck.driver.bean.task.JsonOrderListData;
import com.shengwei.truck.driver.bean.task.JsonSearchUserData;
import com.shengwei.truck.driver.bean.task.JsonTaskDetailData;
import com.shengwei.truck.driver.bean.task.JsonTaskListData;
import com.shengwei.truck.driver.bean.task.OrderItem;
import com.shengwei.truck.driver.bean.task.TaskItem;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;

/**
 * 可以将Repository和 DataSource这两者合并起来看作是MVVM中的Model层，实质最终获取服务起数据的是DataSource,
 * 这里引入Repository的目的是根据业务需求提前对服务器返回的数据进行加工处理（最终接近View层需要显示的数据结构），这样VM(ViewModel)层将会变得简洁，而DataSource
 * 只负责从服务器获取数据，达到获取数据模块化。
 */
public class Repository {
    private static volatile Repository instance;
    private DataSource dataSource; //专门用于负责从服务器接口获取数据

    private Repository(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    /**
     * 获取单例
     *
     * @return
     */
    public synchronized static Repository getInstance(DataSource dataSource) {
        if (instance == null) {
            instance = new Repository(dataSource);
        }
        return instance;
    }

    /**
     * 调遣dataSource去调用服务器接口，
     *
     * @param username：                                                       用户名
     * @param password：密码
     * @param jsonLoginLiveData：                                              服务器返回的数据 将填充进LiveData
     * @param app：将Myapplication作为全局context,以防止内存泄露;切记不要传递Activity的this作为上下文。
     * @return
     */
    public MutableLiveData<Result<JsonLoginData>> login(String username, String password, MutableLiveData<Result<JsonLoginData>> jsonLoginLiveData, Application app) {
        MutableLiveData<Result<JsonLoginData>> result = dataSource.login(username, password, jsonLoginLiveData, app);
        return result;
    }


    /**
     * 获取短信验证码接口
     * 调遣dataSource去调用服务器接口，
     *
     * @param mobileNum:手机号
     * @param pageType：页面类型: USER_REGISTER(注册页面),FORGET_PASSWORD（忘记密码页面）,CHANGE_PASSWORD（修改密码页面）
     * @param smsLiveData
     * @return
     */
    public MutableLiveData<Result<String>> getSmsCode(String mobileNum, String pageType, MutableLiveData<Result<String>> smsLiveData) {
        MutableLiveData<Result<String>> result = dataSource.getSmsCode(mobileNum, pageType, smsLiveData);
        return result;
    }

    /**
     * 注册接口
     * 调遣dataSource去调用服务器接口，
     *
     * @param registParam:注册时需要的参数
     * @param registLiveData
     * @return registLiveData
     */
    public MutableLiveData<Result<String>> regist(HashMap<String, String> registParam, MutableLiveData<Result<String>> registLiveData) {
        MutableLiveData<Result<String>> result = dataSource.regist(registParam, registLiveData);
        return result;
    }


    /**
     * @param taskStatus:        任务状态：  0未接单 1接单 2提货-运输 3榜单 4完成 5取消
     * @param pageNum:           页码:
     * @param pageSize：一页显示的条目个数
     * @param isForward: 是否转派列表
     * @param taskListLiveData：  服务器返回的数据 将填充进LiveData,以便通知UI层
     * @return result
     */
    public MutableLiveData<Result<JsonTaskListData>> getTaskList(String taskStatus, int pageNum, int pageSize, int isForward,
                                                                 MutableLiveData<Result<JsonTaskListData>> taskListLiveData) {
        MutableLiveData<Result<JsonTaskListData>> result = dataSource.getTaskList(taskStatus, pageNum, pageSize, isForward,taskListLiveData);
        return result;
    }

    /**
     * 修改密码（忘记密码）公用
     *
     * @param mobileNum         :  手机号码
     * @param password          :   新密码
     * @param captcha           ：  短信验证码
     * @param modifyPwdLiveData
     * @param pageType:         "FORGET_PASSWORD"（忘记密码页面）,"CHANGE_PASSWORD"（修改密码页面）
     * @return result
     */
    public void resetPwd(String mobileNum, String password, String captcha, String pageType, MutableLiveData<Result<String>> modifyPwdLiveData) {
        dataSource.resetPwd(mobileNum, password, captcha, pageType, modifyPwdLiveData);
    }

    /**
     * 获取任务详情
     *
     * @param taskId：                     任务号
     * @param taskDetailLiveData：服务器返回的数据 将填充进LiveData,以便通知UI层
     */
    public void getTaskDetail(String taskId, MutableLiveData<Result<JsonTaskDetailData>> taskDetailLiveData) {
        dataSource.getTaskDetail(taskId, taskDetailLiveData);
    }

    /**
     * 获取当前用户信息
     */
    public void getUserInfo(MutableLiveData<Result<JsonCurUserInfoData>> curUserInfo) {
        dataSource.getUserInfo(curUserInfo);
    }

    /**
     * 修改手机号
     *
     * @param identify
     * @param mobileNum :    新的手机号
     * @param captcha ：短信验证码
     */
    public void updateMobile(String identify, String mobileNum, String captcha, MutableLiveData<Result<String>> modifyMobileData) {
        dataSource.updateMobile(identify,mobileNum, captcha, modifyMobileData);
    }

    public void postPicture(File file, boolean isThumb,MutableLiveData<Result<JsonPostFileData>> postAvatarLiveData) {
        dataSource.postPicture(file, isThumb,postAvatarLiveData);
    }

    /**
     * step2.调用业务服务器的上传头像接口，上传图片URL与本次业务的标识如“头像”，最终完成修改头像操作
     *
     * @param idCard
     * @param name
     * @param avatarThumbUrl :缩略图地址
     * @param avatarUrl ：           原图地址
     * @param postAvatarLiveData ：  服务器返回的数据 将填充进LiveData,以便通知UI层
     */
    public void updateUserInfo(String idCard, String name, String avatarThumbUrl, String avatarUrl, String smsCode,MutableLiveData<Result<String>> postAvatarLiveData) {
        dataSource.updateUserInfo(idCard, name,avatarThumbUrl, avatarUrl,smsCode, postAvatarLiveData);
    }

    /**
     * 接受任务
     *
     * @param taskId:           任务id
     * @param taskStatus：任务状态，传 1 表示要接受任务
     * @param mRecvTaskLiveData 服务器返回的数据 将填充进LiveData,以便通知UI层
     */
    public void recvTaskDetail(String taskId, int taskStatus, MutableLiveData<Result<String>> mRecvTaskLiveData) {
        dataSource.recvTaskDetail(taskId, taskStatus, mRecvTaskLiveData);
    }

    /**
     * 模糊查询车辆名称
     *
     * @param keyWord
     * @param searchLiveData 服务器返回的数据 将填充进LiveData,以便通知UI层
     */
    public void searchCarName(String keyWord, MutableLiveData<Result<ArrayList<JsonCar>>> searchLiveData) {
        dataSource.searchCarName(keyWord, searchLiveData);
    }

    /**
     * 根据车辆ID,获取车辆详情
     *
     * @param carId
     * @param carDetailLiveData
     */
    public void getCarDetail(String carId, MutableLiveData<Result<JsonCar>> carDetailLiveData) {
        dataSource.getCarDetail(carId, carDetailLiveData);
    }

    /**
     * 绑定车辆信息
     *
     * @param carNum：          车辆号
     * @param carId：           车辆名称ID
     * @param isEtcNum:          etc号，1有，0无
     * @param durableYears:    使用年限
     * @param bindCarLiveData: 服务器返回的数据 将填充进LiveData,以便通知UI层
     */
    public void bindCarInfo(String carNum, String carId, int isEtcNum, String durableYears, MutableLiveData<Result<String>> bindCarLiveData) {
        dataSource.bindCarInfo(carNum, carId, isEtcNum, durableYears, bindCarLiveData);
    }

    /**
     * 获取 "车辆信息"页面的数据：包括车型自带的厂商品牌信息，还包括用户手动录入的信息如车牌号等
     * @param carInfoPageLiveData: 服务器返回的数据 将填充进LiveData,以便通知UI层
     */
    public void getMyCarInfo(MutableLiveData<Result<JsonCar>> carInfoPageLiveData) {
        dataSource.getMyCarInfo(carInfoPageLiveData);
    }

    /**
     * 退出登录
     * @param logoutLiveData
     */
    public void logout(MutableLiveData<Result<String>> logoutLiveData) {
        dataSource.logout(logoutLiveData);
    }

    /**
     * 获得订单详情
     *
     * VM层调用M层（Repository+DataSource）
     * @param orderId : 订单ID
     * @param orderDetailLiveData 服务器返回的数据 将填充进LiveData,以便通知UI层
     * @return
     */
    public void getOrderDetail(String orderId, MutableLiveData<Result<JsonOrderDetailData>> orderDetailLiveData) {
        dataSource.getOrderDetail(orderId,orderDetailLiveData);
    }
    /**
     * 获取计划单列表
     * @param pageNum：   页码
     * @param pageSize：  每页显示条目数
     * @return
     */
    public void getPlanOrders(int pageNum, int pageSize, MutableLiveData<Result<JsonOrderListData<OrderItem>>> jsonPlanOrderListLiveData) {
        dataSource.getPlanOrders(pageNum,pageSize,jsonPlanOrderListLiveData);
    }

    /**
     * 申请任务
     * @param orderId 订单ID
     * @param mApplayTaskLiveData： 服务器返回的数据 将填充进LiveData,以便通知UI层
     */
    public void applyTask(String orderId, MutableLiveData<Result<String>> mApplayTaskLiveData) {
        dataSource.applyTask(orderId,mApplayTaskLiveData);
    }

    /**
     * step2.调用业务服务器的上传榜单接口，上传图片URL与本次业务的标识如“榜单”，最终完成上传榜单信息等操作
     *
     * @param poundsListInfo:榜单信息
     *
     */
    public void postPoundsListInfo(PoundsListBean poundsListInfo, MutableLiveData<Result<String>> postPoundsLiveData) {
        dataSource.postPoundsListInfo(poundsListInfo,postPoundsLiveData);
    }

    /**
     * 获取当前任务的位置轨迹
     * @param taskId: 当前正在进行的运输任务ID
     * @param startTime: 查询的轨迹起始时间
     * @param endTime： 查询的轨迹结束时间
     * @param mTrackLiveData 服务器返回的数据 将填充进LiveData,以便通知UI层
     */
    public void getTrack(String taskId, long startTime, long endTime, MutableLiveData<Result<JsonTrackData>> mTrackLiveData) {
        dataSource.getTrack(taskId,startTime,endTime,mTrackLiveData);
    }

    /**
     * 获取当前正在进行的任务
     */
    public void getCurTask(MutableLiveData<Result<TaskItem>> curTaskLiveData) {
        dataSource.getCurTask(curTaskLiveData);
    }
    /**
     * 根据手机号查找用户
     * @param mobileNum
     * @param searchUserLiveData 服务器返回的数据 将填充进LiveData,以便通知UI层
     */
    public void searchUserByMobile(String mobileNum, String taskId,MutableLiveData<Result<JsonSearchUserData>> searchUserLiveData) {
        dataSource.searchUserByMobile(mobileNum,taskId,searchUserLiveData);
    }
    /**
     * 分享或转派任务
     *
     * @param taskId： 要转派（共享）的任务ID
     * @param targetUserId：转派（共享）给的目标用户
     * @param shareOrForward : 1转派； 2共享
     * @param shareForwardLiveData: 服务器返回的数据 将填充进LiveData,以便通知UI层
     */
    public void shareForward(String taskId, String targetUserId, int shareOrForward, MutableLiveData<Result<String>> shareForwardLiveData) {
        dataSource.shareForward(taskId,targetUserId,shareOrForward,shareForwardLiveData);
    }

    /**
     * 同意还是拒绝 别人的转派和分享
     * @param taskId : 别人转派（分享）过来的任务ID
     * @param isAgree : 1 同意；0拒绝
     * @param type ： 1转派，2共享
     * @param shareForwardVerify 服务器返回的数据 将填充进LiveData,以便通知UI层
     * @param mark
     */
    public void shareForwardVerify(String taskId, int isAgree, int type,  String mark,MutableLiveData<Result<String>> shareForwardVerify) {
        dataSource.shareForwardVerify(taskId,isAgree,type,mark,shareForwardVerify);
    }

    /**
     * 获取未读消息数
     * @param unReadNumLiveData 服务器返回的数据 将填充进LiveData,以便通知UI层
     */
    public void getUnReadNum(MutableLiveData<Result<String>> unReadNumLiveData) {
        dataSource.getUnReadNum(unReadNumLiveData);
    }
    /**
     * 列表项点击后，提交“消息已读”接口
     * @param msgId: 当前消息ID
     * @param isAll: 是否全部清除已读，1全部; 否则 0,只清除当前 msgId为已读
     * @param hasReadLiveData：服务器返回的数据 将填充进LiveData,以便通知UI层
     */
    public void postHasRead(String msgId, int isAll, MutableLiveData<Result<String>> hasReadLiveData) {
        dataSource.postHasRead(msgId,isAll,hasReadLiveData);
    }

    /**
     * @param pageNum: 分页页码
     * @param pageSize：每页显示的条目数
     * @param msgType： 消息类别
     * @param msgListLiveData: 服务器返回的数据 将填充进LiveData,以便通知UI层
     */
    public void getMsgList(int pageNum, int pageSize, String msgType, MutableLiveData<Result<JsonMsgListData>> msgListLiveData) {
        dataSource.getMsgList(pageNum,pageSize,msgType,msgListLiveData);
    }

    /**
     * 检查磅单状态
     * @param taskId
     * @param checkPoundsStateLiveData  服务器返回的数据 将填充进LiveData,以便通知UI层
     */
    public void checkPoundsState(String taskId, MutableLiveData<Result<JsonPoundsState>> checkPoundsStateLiveData) {
        dataSource.checkPoundsState(taskId, checkPoundsStateLiveData);
    }

    /**
     * 撤销任务
     * @param taskId：任务ID
     * @param cancelTaskLiveData:服务器返回的数据 将填充进LiveData,以便通知UI层
     */
    public void cancelTask(String taskId, MutableLiveData<Result<String>> cancelTaskLiveData) {
        dataSource.cancelTask(taskId,cancelTaskLiveData);
    }

    /**
     * 获取某一天的统计数据
     * @param date： 某一天的日期
     * @param statisticData：统计数据，服务器返回的数据 将填充进LiveData,以便通知UI层
     */
    public void getStatisticOneDay(String date, MutableLiveData<Result<JsonStatisticsOneDayData>> statisticData) {
        dataSource.getStatisticOneDay(date,statisticData);
    }

    /**
     * 按照 年，月，周统计数据
     * @param type ：  0代表周;  1代表月;  2代表年
     * @param year ：       type为1或2时传递
     * @param month :      type为1时传递
     * @param startTime : type为0时，传递周的开始时间
     * @param endTime :    type为0时，传递周的结束时间
     * @param statisticYmd
     */
    public void getStatisticByYmd(int type, int year, int month, long startTime, long endTime, MutableLiveData<Result<JsonStatisticsYmdData>> statisticYmd) {
        dataSource.getStatisticByYmd(type,year,month,startTime,endTime,statisticYmd);
    }
}
